#include <asm-generic/errno-base.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>

struct msgbuf {
  long mtype;
  char mtext[100];
};

int main(int argc, char *argv[]) {
  key_t msg_key = ftok(".", 1);
  if (msg_key == -1) {
    perror("ftok fail");
    exit(-1);
  }

  int msg_id = msgget(msg_key, IPC_CREAT | IPC_EXCL | 0666);
  if (msg_id < 0) {
    if (errno == EEXIST) {
      msg_id = msgget(msg_key, 0666);
      if (msg_id < 0) {
        perror("msg fail");
        exit(-1);
      }
    } else {
      perror("msg fail");
      exit(-1);
    }
  }

  struct msgbuf buf;
  buf.mtype = 1;

  while (1) {
    printf("please input:");
    memset(buf.mtext, 0, 100);
    scanf("%s", buf.mtext);

    msgsnd(msg_id, &buf, sizeof(struct msgbuf), 0);
    if(!strcmp("bye",buf.mtext))
      break;
  }

  msgctl(msg_id,IPC_RMID,NULL);
  return 0;
}
